﻿/*----------------------------------------------------------------
       // Copyright (C) 2008 安华顺通(北京)科技有限公司
       // 版权所有。 
       //
       // 文件名：DeleteContextMenu.cs
       // 文件功能描述：提供删除结点功能的右键菜单。
       //
       // 
       // 创建标识：杨波
       //
       // 修改标识：杨波20080827
       // 修改描述：增加删除结点进的与数据库同步功能。
       //
       // 修改标识：
       // 修改描述：
//----------------------------------------------------------------*/

#region UsingStatements

using System;
using System.IO;
using System.Windows.Forms;

#endregion

namespace RuleCode.ObjectTree
{
    public partial class DeleteContextMenu : BaseContextMenu
    {
        public event DeleteNodeEventHandler OnBeforeNodeDelete;
        public event DeleteNodeEventHandler OnAfterNodeDelete;

        public DeleteContextMenu()
        {
            //base.InitializeComponent();
            InitializeComponent();
            baseContextMenuStrip.Items.Insert(3, deleteToolStripMenuItem);
        }


        private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
        {
            //string dir = Path.GetDirectoryName(Application.ExecutablePath);
            if (MessageBox.Show("确定要删除结点吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            { delete(); }


        }

        private void delete()
        {
            //在删除节点之前所做的工作
            BeforeNodeDelete(new DeleteNodeEventArgs(Util.SelectedNode));
            Util.ActiveTreeView.BeginUpdate();
            if (Util.SelectedNode.SysXmlNode.ParentNode == null)
            {
                TreeViewOpr.SetSysXmlExpire();
                Util.ActiveTreeView.Enabled = false;
                foreach (SysTreeView sysTreeView in TreeViewOpr.LivelySysTreeViewList)
                {
                    sysTreeView.Enabled = false;
                }
                MessageBox.Show("删除失败。打开新OT删除此对象。");
                return;
            }
            Util.SelectedNode.Expand();
            try
            {
                deleteFile(Util.SelectedNode);
            }catch(Exception error){
                Util.SetStatusInfo(error .Message );
            }
            //Util.SelectedNode.SysXmlNode.ParentNode.RemoveChild(Util.SelectedNode.SysXmlNode);            



            ExecSql();
            SetExpire();
            //((SysTreeNode)(Util.SelectedNode.Parent)).SysXmlNode.RemoveChild(Util.SelectedNode.SysXmlNode);

            Util.SelectedNode.SysXmlNode.ParentNode.RemoveChild(Util.SelectedNode.SysXmlNode);
            Util.SelectedNode.Remove();
            TreeViewOpr.saveOTXML();
            Util.ActiveTreeView.EndUpdate();
            AfterNodeDelete(new DeleteNodeEventArgs(Util.SelectedNode));
            Util.CurrentProperty = null;
            Util.PreProperty = null;

            
        }

        private void deleteFile(SysTreeNode node)
        {
            try
            {
                Util.SetPropertyContent(node);
                node.Expand();

                //DELETENODE
                //如果是团队设置，需要版本控制，而将AOTFile加入项目
                if (Util_DTE.IsAddLabelAndAOTToSolution && node.Property != null)
                {
                    if (Util_DTE.GetAOTFileProject != null)
                    {
                        string propertyFileName = Util_DTE.GetAOTFileProjectPath.Trim("\\".ToCharArray()) + GlobalStaticDirectoryPath.ObjectData + "\\" + node.Property.ID + ".xml";
                        Util_DTE.DeleteFileInProject(Util_DTE.GetAOTFileProject, propertyFileName);
                    }
                }

                if (node.Property != null)
                {
                    //结点没有属性的情况
                    FileInfo file = new FileInfo(Util.GetObjDataPath + "\\" + node.Property.ID + ".xml");
                    if (file.Exists)
                    {
                        file.Delete();
                    }
                }
                //删除 项目中对应的生成类文件     AddBy DingYuliang
                if (Util_DTE.IsAddToProjectAtCompiled)
                    Util_DTE.DeleteGeneratedFile(node);



                if (node.Nodes.Count != 0)
                {
                    foreach (SysTreeNode subnode in node.Nodes)
                    {
                        deleteFile(subnode);
                    }
                }
            }
            catch (Exception error)
            {
                MessageBox.Show("删除失败："+error.Message );
                Util.SetStatusInfo(error.Message);
            }

        }

        /// <summary>
        /// 提供这个虚方法，在需要具体的同步时，重写该方法，如删除表或字段。
        /// </summary>
        protected virtual void ExecSql()
        {
        }

        /// <summary>
        /// 提供SetExpire()，刷新对象列表的标志。
        /// </summary>
        protected virtual void SetExpire()
        {
        }

        protected virtual void removeDeleteMenuItem()
        {
        }

        protected ToolStripMenuItem DeleteMenuItem
        {
            get { return deleteToolStripMenuItem; }
        }

        protected void BeforeNodeDelete(DeleteNodeEventArgs e)
        {
            if (OnBeforeNodeDelete != null)
            {
                OnBeforeNodeDelete(this, e);
            }
        }

        protected void AfterNodeDelete(DeleteNodeEventArgs e)
        {
            if (OnAfterNodeDelete != null)
            {
                OnAfterNodeDelete(this, e);
            }
        }

    }
}